עבודה עם OOP
אני עדיין לא הצלחתי להבין למה עדיף לעבוד עם OOP גם לאחר שקראתי המון המון מדריכים בנושא.
הבנתי רק שעדיף להשתמש ב OOP בשביל MYSQL כדי שאם אי פעם אני ארצה לעבור מ MYSQL רגיל ו MYSQLI היה לי קל יותר.
אבל במערכת משתמשים, מה יקל עלי אם אני אעבוד עם OOP? יש לכם דוגמא של דברים שאתם עושים עם OOP ותוכלו להסביר לי למה עדיף להשתמש בזה ואיך משתמשים בזה במערכות משתמשים וכו..
תודה!
44 תשובות
אם יהיה לך קוד ארוך
ותיהיה שגיאה הוא ם יגיד לך באיזה מחלקה זה.
וגם הקוד ניראה יותר מסודר וגם אנשים יוכלו להמסיך את עובדתך
אתה יכול לראות את המדריך הבא:
http://phpguide.co.il/OOP+%D7%AA%D7%9B%D7%A0%D7%95%D7%AA+%D7%9E%D7%95%D7%A0%D7%97%D7%94+%D7%A2%D7%A6%D7%9E%D7%99%D7%9D+%D7%9E%D7%91%D7%95%D7%90.htm
מקווה שאחריו תבין
razand, לא ענית על השאלה שלי ממש.
raslin, ראיתי את המדריך הזה, לא הבנתי מה זה נותן לי עדיין, כמו שאמרתי, יהיה לכם אפילו קשה לתת לי מדריך שלא קראתי (במיוחד בעברית).
פשוט תמשיך לעבוד בלי oop, תבנה מערכות גדולות ותסתבך.
כשאתה מייצג עצם באתר שלך, כמחלקה, אתה יכול להקל על מי שקורא את הקוד שלך, וגם מבחינה לוגית הקוד שלך יהפוך למובן יותר. שלא נדבר על כך שזה מקצר לך את הקוד ולעיתים תראה שהקוד יהיה יותר יעיל אם תעבוד ב-oop.
אתה יכול טכנית לבנות פונקציה של שליחת הודעה. אבל "שליחת הודעה" זאת פעולה שבן אדם עושה. עדיף ליצור אובייקט של אדם ולהפעיל ממנו את המתודה הזאת, מאשר ליצור פעולה ולהפעיל על הנתונים. יש לנו מזל שהעולם עובד ככה ולא אחרת, וכדאי להתחיל ליישם את הפרדיגמה הזאת גם בקוד.
כבר בניתי מערכות גדולות ומסובכות בלי OOP, אבל עכשיו אני מנסה למצוא לו שימוש, למשל ל SQL ולפעול כמו INSERT, שיהיה קל יותר.
האם יש לכם דוגמא מהמערכות שלכם לאיך אתם משתמשים ב OOP?
לא אמרתי שזה בלתי אפשרי, אמרתי שהקוד שלך יהיה גרוע ויהיה קשה לתחזק אותו. אם תתן לנו לצפות בקוד הזה, מבטיח לך ב-100% שניצחק ממנו.
ואם הדוגמא היחידה לשימוש ב-oop שאתה מכיר זה wrapper למסד נתונים, אז אני משתתף בצערך. למה מה הבעיה לבנות פונקציות של שליפה ומחיקה והתחברות ללא oop כמו שאתה עושה במקרים אחרים? קשה?
כל הפעולות שהמשתמש יכול לעשות באתר שלך - צריך לדחוף אותם לאובייקט של משתמש. פרטים אודות המשתמש צריכים להיות כתכונות של מחלקת המשתמש (properties). הנה לך עוד שימוש.
אני חושב שהבנתי, נגיד להכניס את המשתמש לתוך CLASS (לפי ה ID שלו) וככה אפשר לשלוף מידע.
במקום בקובץ config שבו אני משתמש ב SQL כדי לשלוף ומכניס למשתנה, אז להשתמש ב CLASS ובתכונות כדי לשלוף את הפרטים עליו.
יש לך עוד דוגמאות?
כל אובייקט באתר ניתן להציגו בתור מחלקה. כאן, ב-phpguide אני כמעט בטוח ששאלה זה אובייקט נפרד ותשובה זה אובייקט נפרד (אולי הם יורשים מאובייקט פוסט כלשהו שהרי גם לשאלה וגם לתשובה יש מאפיינים זהים כמו מחבר השאלה/תשובה, תראיך וכדומה) - מבלי להסתכל בקוד.
מדובר פה על תורה שלמה,
אני מבין אותך כי הייתי בנקודה הזו (מזמן!!)
והיום אני לא חושב בכלל לבנות משהו בלי זה,
לדעתי תתחיל לבנות עם שימוש במחלקות,
תנסה להשתמש בפריימוורק כלשהו אולי,
ולאט לאט תבין שזה מקל על העניינים, ומשם תתקדם
מה שאני אמרתי נכון?\
ליצור CLASS שמקבל ID של המשתמש ואז להכניס את הפרטים של אותו המשתמש וככה גם להציג אותם ולבצע כל מני פעולות ופונקציות של משתמש, האם זה אחד מהאפשרויות שכדאי להשתמש בהם ה OOP?
בערך הכל זה אומר שהקוד היחידי ב phpguide שלא שייך למחלקה כלשהי זה index.php שגם בו יש בסה"כ משהו כמו
שאגב האתר בקוד פתוח, אתה יכול לקחת ולראות את הקוד לבד.
דוגמאות? בבקשה. כתבת תגובה? זה מופע של "תגובה" שיש לה מאפיינים כמו "מחבר" ו"טקסט"
ופעולות של "למחוק" ו"לשנות טקסט".
אני בניתי משחק דפדפן,
מאות מחלקות,
הכל OOP בלבד.
בלי זה היה קשה בהרבה להתמודד עם הסיבוך
אוקיי, תודה intval, אני מקווה שהבנתי, אם לא תתקן אותי.
מופע - class
מאפיינים זה מה שמכניסים ב class למשל:
public $bla;
}
והפעולות אלה הפונקציות שב class?
אני צריך תשובות כמה שיותר מהר כי עוד החופש יש לי פרוייקט ענק ואני רוצה לנסות להקל עליו עם OOP, תודה :)
כמעט נכון.
מופע הוא ה-instance של ה-class:
$b = new bla;
כאן יש שני מופעים של המחלקה bla.
class - עצמים ב php?
מופע - יצירת ה class
מאפיינים/תכונות - משתנים שנמצאים ב class
פונקציות/מתודות - פונקציות שנמצאות ב class
למשל אם אני רוצה ליצור מערכת תגובות, אני יוצר את class לתגובות נותן לו מאפיינים של: יוצר התגובה, תאריך, שעה וכו...
הפונקציות של ה class זה: פרסום התגובה, עריכת התגובה, מחיקת התגובה וכו...
ואחר כך אני פשוט קורא לפונקציות האלה מתוך ה class וזהו?
אני מקווה שהבנתי את זה נכון, זה נראה לי באמת מקל על העבודה ומסדר אותה.
הבנת נכון.
אוקיי, מצויין.
ונגיד אני רוצה class למשתמש. אז ה class הזה גם להרשמה שלו, גם להתחברות, גם להגדרות וגם לכל פעולה שהוא יכול לעשות?
לא לא לא, זה לא נכון.
class זה לא עצם! אלה דברים שונים.
קלאס (מחלקה) הוא מבנה סטטי. הוא "חי" בכל הזמן שהסקריפט עדיין רץ.
עצם (מהתפתחות ה-OOP) נחשב כפשוט מופע חדש של המחלקה (כלומר, זהה ל-instance).
עריכה:
דרך אגב, מופע זה לא "יצירת הclass".
Plural צודק, לא דייקתי.
בקשר לתגובה הקודמת:
ה-class יכיל מה שתקבע לו. המחלקה user אמורה להכיל דברים שהמשתמש יכול לבצע ומאפיינים של המשתמש.
הדברים שהמשתמש יכול לבצע לא כולל הרשמה או כן כולל? איך אתם עושים את זה?
מה למשל אתם שמים במתודות של המשתמש?
תחליט לבד מה לשים בכל מקום.
במשתמש אתה יכול לשים פעולות כמו עדכונים של דברים
עדכןשם, עדכן אימייל, עדכן סיסמה, מחק
ולהישתמש במחלקה הזאת בתור פרמטר למחלקות אחרות כמו "הזדהות" "הודעות פרטיות" וכו
משהו כזה:
public function send(user $user) {
// send...
}
}
$msg = new privateMsg;
$msg->send(new user($id));
שלחתי למתודה send את ה-instance (מופע) של המחלקה user.
שים לב שבכותרת המתודה send, כשהגדרתי פרמטר $user, רשמתי לפניו את המילה user שאומרת שהפרמטר שמתקבל צריך להיות Instance של המחלקה user. אם תשלח משהו אחר תקבל שגיאה.
לדבר הזה קוראים type hinting והוא זמין מגירסה 5.1.
אוקיי.
ה user הראשון הוא קריאה למופע של user ומשתנה user הוא המתשנה של המופע user?
ה user הראשון זו רק הגדרה לכך שהמשתנה שהפונקציה מוכנה לקבל זה משתנה מסוג (מחלקה) user
(בלי קשר, כאשר מדובר במחלקה רצוי (מאוד!) לכתוב עם אות גדולה (User)
עשר פעולות שיעזרו לך:
1.קח דף ועט
2.צייר ריבועים
3.צייר משתמש
4.תרשום מה אתה רוצה שהוא יוכל לעשות במערכת/אתר/web service
5.תחלק את כל אחד מהפעולות לפי מכנה משותף לריבועים
5.1.יוכל לפרסם דברים? אז נכניס את זה לפעולות של היוזר וכו'
6.תעבור על כל הריבועים תראה אם יש פעולות דומות שפספת והם לא באותו ריבוע
7.סדר הכל מחדש
8.תעביר חצים מהבן אדם לריבועים ולפי הפעולות שיוכל לבצע ואיזה ערך נכנס ומה חוזר
8.1.משתמש->קלט[ריבוע של קלט(סינון XSS וכו)]->הרשמה[ריבוע של רישום](מעביר שם וסיסמא)->ביצוע בDB[ריבוע של דטהבייס](מחזיר מחרוזת חיבור?) ->פלט[ריבוע של פלט]
9.ברגע שיש לך סקיצה עם חצים וריבועים אתה יכול להתחיל לבנות משהו והכל ילך יותר חלק
10.כנס שוב לפה תשאל למה לא עובד???
:)
נתקעתי ב 8, מז"א, ערך נכנס ויוצא, נגיד אני עושה קניית חיילים, אז הערך הוא ה ID של החייל ומה שיוצא זה ההוספה של החיילים למשתמש?
נגיד עכשיו אני עושה פונקציה שתתן לי את שם המשתמש
אז מה שאני מעביר לפונקציה יהיה הID ומה שאני אקבל זה השם משתמש.. לזה התכוונתי
הכוונה היא מה קורה שמשתשמש עושה לוגין:
אז לדוגמא כל התהליך עד הרישום במסד הנתונים:
משתמש מזין שם משתמש וסיסמא->קבלת שם משתמש וסיסמא->סינון תווים בעייתיםXSS->בדיקה האם קיים כבר השם משתמש->רישום בDB ..
אז זאת אומרת במה אנחנו משתמשים עכשיו באיזה מחלקות אז:
קלט->סינון(בתוך קלט)->בדיקה(בתוך מחלקת רישום)->רישום(בתוך מחלקת רישום)
אז העיניין בשלב התכנון של הריבועים לוודא שאין משהו שהולך הלוך חזור בצורה לא יעילה
אני אנסה לקצר לשלב 1,
תפרק את המחלקות כאילו מדובר בעולם אמיתי,
תחשוב על מאפיינים בעולם האמיתי של האובייקט שלך, וככה תדע מה התכונות ומה הפונקציות,
לדוגמא, אם זה משתמש שצריך לכתוב תגובה כלשהי,
אז הייתי יותר משתמש, עם פונקציה שיודעת לכתוב ,
ומה שהפונקציה מקבלת, זה אובייקט של תגובה,
שלאותו אובייקט יש מאפיינים של תגובה...
כמו בני אדם, שיודעים לכתוב, בשביל זה הם צריכים דף ועט,
ומה המאפיינים בדף? זה שאלון? מבחן? מה התוכן שלו?
God!!